package com.owen.he.jee.web;

import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;

public class ExcelTest {
	public String exportExcel(HttpServletRequest request,  
            HttpServletResponse response) throws Exception {  
        String temp_num = ("temp_num");// 二级标题序号  
        String[] temp_head = "temp,head".split(",");// 二级标题名  
  
        /** 
         * excel组织结构开始 
         */  
        HSSFWorkbook wb = new HSSFWorkbook(); // 创建一个excel文件  
        HSSFSheet sheet = wb.createSheet("sheet1");   // 创建了一个工作簿  
          
        /***第一行样式start****/  
        HSSFCellStyle style = wb.createCellStyle(); // 样式对象   
        //设置标题字体格式    
        HSSFFont font = wb.createFont();       
        //设置字体样式     
        font.setFontHeightInPoints((short)16);   //--->设置字体大小    
        font.setFontName("Courier New");   // 设置字体，是什么类型例如：宋体    
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);   // 字体加粗  
        style.setFont(font);  
//        style.setWrapText(true);  // 是否自动换行  
        style.setBorderLeft((short)1);  
        style.setBorderRight((short)1);  
        style.setBorderBottom((short)1);  
        style.setBorderTop((short)1);  
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平    
        /***end****/  
          
          
        /***第二行样式start****/  
        HSSFCellStyle style2 = wb.createCellStyle(); // 样式对象  
        HSSFFont font2 = wb.createFont();    
        font2.setFontHeightInPoints((short)13);   //--->设置字体大小    
        font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  // 字体加粗  
        style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平    
        style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直局中  
        style2.setBorderLeft((short)1);  
        style2.setBorderRight((short)1);  
        style2.setBorderBottom((short)1);  
        style2.setBorderTop((short)1);  
        style2.setFont(font2);  
        /***end****/  
          
        /***第三行样式start****/  
        HSSFCellStyle style3 = wb.createCellStyle(); // 样式对象  
        HSSFFont font3 = wb.createFont();    
        font3.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  // 字体加粗  
        style3.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平    
        style3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直局中  
        style3.setBorderLeft((short)1);  
        style3.setBorderRight((short)1);  
        style3.setBorderBottom((short)1);  
        style3.setBorderTop((short)1);  
        style3.setFont(font3);  
        /***end****/  
          
        /** 表格第三行  start**/  
        HSSFRow row3 = sheet.createRow(2);   // 创建一行   
          
        // 第三行第一列，第二行中进行合并，需要在第三行中把边框显示，否则边框显示不全  
        HSSFCell cell3_1 = row3.createCell((short)0);   // 创建一个单元格    
        cell3_1.setCellStyle(style3);  
        // 所有列  
        for(int i = 1;i < temp_head.length; i++){  
            HSSFCell cell3_2 = row3.createCell((short)i);   // 创建一个单元格    
            cell3_2.setCellValue(temp_head[i-1]);  
            cell3_2.setCellStyle(style3);  
        }  
        /** 表格第三行 end **/  
          
        /** 表格第二行 start**/  
        HSSFRow row2 = sheet.createRow(1);   // 创建一行    
        // 创建第二行所有用到的格子，然后把边框设为有边框,合并单元格也必须创建，不创建则不会有边框  
        for(int i = 1;i < temp_head.length; i++){  
            HSSFCell cell = row2.createCell((short)i);   // 创建一个单元格    
            cell.setCellStyle(style2);  
        }  
          
        // 跨两行表头  
        sheet.addMergedRegion(new CellRangeAddress(1, (short) 0, 2, (short)0));
        HSSFCell cell2_0 = row2.createCell((short)0);   // 创建一个单元格    
        cell2_0.setCellValue("序号");     // 缺省字段  
        cell2_0.setCellStyle(style3);  
          
        for(int i = 1;i < temp_head.length; i++) {  
            if(temp_head[i].equals("专用线单位名称")) {  
                sheet.addMergedRegion(new CellRangeAddress(1, (short) (i+1), 2, (short)(i+1)));
                HSSFCell cell = row2.createCell((short)(i+1));   // 创建一个单元格    
                cell.setCellValue(temp_head[i]);        // 缺省字段  
                cell.setCellStyle(style3);  
            }  
            if(temp_head[i].equals("接轨点")) {  
                sheet.addMergedRegion(new CellRangeAddress(1, (short) (i+1), 2, (short)(i+1)));
                HSSFCell cell = row2.createCell((short)(i+1));   // 创建一个单元格    
                cell.setCellValue(temp_head[i]);        // 缺省字段  
                cell.setCellStyle(style3);  
            }  
        }  
          
        // 判断股道名称是否存在  
        // 创建两个变量，一个用来记录开始点，一个用来记录数量  
        int startPoint = 0;  
        int endCount = 0;  
        for(int i = 1;i < temp_head.length; i++) {  
            if(temp_head[i].equals("股道名称")) {  
                // 如果查到，则记录开始  
                if(startPoint == 0) {  
                    startPoint = i+1;  
                }  
                endCount ++;  
            } else if(temp_head[i].equals("股道长度")) {  
                if(startPoint == 0) {  
                    startPoint = i+1;  
                }  
                endCount ++;  
            } else if(temp_head[i].equals("钢轨类型")) {  
                if(startPoint == 0) {  
                    startPoint = i+1;  
                }  
                endCount ++;  
            } else if(temp_head[i].equals("专用线总延长公里")) {  
                if(startPoint == 0) {  
                    startPoint = i+1;  
                }  
                endCount ++;  
            }  
        }  
        int count = startPoint + endCount - 1;  
        if(count > 0) {  
            // 四个参数分别是：起始行，起始列，结束行，结束列 (拥有长度减一)  
            sheet.addMergedRegion(new CellRangeAddress(1, (short) startPoint, 1, (short) (count)));
            HSSFCell cell2_1 = row2.createCell((short)startPoint);  
            cell2_1.setCellValue("股道");  
            cell2_1.setCellStyle(style2);  
        }  
          
        int startPoint2 = 0;  
        int endCount2 = 0;  
        for(int i = 1;i < temp_head.length; i++) {  
            if(temp_head[i].equals("道岔编号")) {  
                // 如果查到，则记录开始  
                if(startPoint2 == 0) {  
                    startPoint2 = i+1;  
                }  
                endCount2 ++;  
            } else if(temp_head[i].equals("左右开")) {  
                if(startPoint2 == 0) {  
                    startPoint2 = i+1;  
                }  
                endCount2 ++;  
            } else if(temp_head[i].equals("岔枕类型")) {  
                if(startPoint2 == 0) {  
                    startPoint2 = i+1;  
                }  
                endCount2 ++;  
            } else if(temp_head[i].equals("道岔型号")) {  
                if(startPoint2 == 0) {  
                    startPoint2 = i+1;  
                }  
                endCount2 ++;  
            }  
        }  
        int count2 = startPoint2 + endCount2 - 1;  
          
        if(count2 > 0) {  
            // 四个参数分别是：起始行，起始列，结束行，结束列 (拥有长度减一)  
            sheet.addMergedRegion(new CellRangeAddress(1, (short) startPoint2, 1, (short) (count2)));
            HSSFCell cell2_2 = row2.createCell((short)startPoint2);  
            cell2_2.setCellValue("道岔");  
            cell2_2.setCellStyle(style2);  
        }  
        /** 表格第二行 end**/  
          
        /** 表格第一行(标题)合并数据根据第三行数据而定 **/  
        HSSFRow row1 = sheet.createRow(0);   // 创建一行    
        // 四个参数分别是：起始行，起始列，结束行，结束列 (拥有长度减一)  
        sheet.addMergedRegion(new CellRangeAddress(0, (short) 0, 0, (short) (temp_head.length-1)));
        row1.setHeightInPoints(20);  // 行高  
        HSSFCell cell1 = row1.createCell((short)0);   // 创建一个单元格    
        cell1.setCellStyle(style);    
        cell1.setCellValue("专用线设备台账");    
        // 创建第一行所有用到的格子，然后把边框设为有边框  
        for(int i = 1;i < temp_head.length; i++){  
            HSSFCell cell = row1.createCell((short)i);   // 创建一个单元格    
            cell.setCellStyle(style);  
        }  
        /** 表格第一行 end **/  
          
        // 算法结束  
        try{                
            response.reset();  
            response.setContentType("application/msexcel;charset=UTF-8");  
            response.addHeader("Content-Disposition", "attachment;filename=\""  
                    + new String(("专用线设备台账" + ".xls").getBytes("GBK"),  
                            "ISO8859_1") + "\"");  
            OutputStream out = response.getOutputStream();  
              
            wb.write(out);  
            out.flush();  
            out.close();  
        }catch(Exception e){    
            e.printStackTrace();    
        }   
        return null;  
    }  
}
